#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;

int t;
int n, m, l, v, ans;
int jk[MAXN];
struct Node{
    int d, v, a, f;
}c[MAXN];

int main(){
    freopen("detect.in", "r", stdin);
    freopen("detect.out", "w", stdout);
    cin>>t;
    while(t--){
        ans=0;
        cin>>n>>m>>l>>v;
        vector<int> V;
        for(int i=0; i<n; i++)
            cin>>c[i].d>>c[i].v>>c[i].a, c[i].f=0;
        for(int i=0; i<m; i++)
            cin>>jk[i];
        for(int i=0; i<m; i++){
            double k;
            for(int j=0; j<n; j++){
                if( c[j].d<=jk[i] ) k = sqrt( (double)c[j].v * c[j].v + (double)2 * c[j].a * ( jk[i] - c[j].d ) );
                if( c[j].d>jk[i] ) continue;
                if( k>v ){
                    if(c[j].f==0) ans++, c[j].f=1;
                    else{
                        int aa;
                        for(aa=0; aa<V.size(); aa++) if(V[aa]==jk[i]) break;
                        if(aa>=V.size()) V.push_back( jk[i] );
                    }
                }
            }
        }
        cout<<ans<<" ";
        int cnt=0;
        for(int i=0; i<V.size(); i++)
            for(int j=0; j<m; j++)
                if(jk[j]==V[i]) cnt++;
        cout<<m-cnt;
    }

    return 0;
}
